package com.sheng.leetcode.year2022.swordfingeroffer.day29;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author liusheng
 * @date 2022/09/29
 *<p>
 * 剑指 Offer 60. n个骰子的点数<p>
 *<p>
 * 把n个骰子扔在地上，所有骰子朝上一面的点数之和为s。输入n，打印出s的所有可能的值出现的概率。<p>
 * 你需要用一个浮点数数组返回答案，其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。<p>
 *<p>
 * 示例 1:<p>
 * 输入: 1<p>
 * 输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]<p>
 *<p>
 * 示例2:<p>
 * 输入: 2<p>
 * 输出: [0.02778,0.05556,0.08333,0.11111,0.13889,0.16667,0.13889,0.11111,0.08333,0.05556,0.02778]<p>
 *<p>
 * 限制：<p>
 * 1 <= n <= 11<p>
 *<p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/nge-tou-zi-de-dian-shu-lcof">...</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class Sword0060 {

    @Test
    public void test01() {
//        int n = 1;
        int n = 2;
        System.out.println(Arrays.toString(new Solution60().dicesProbability(n)));
    }
}
class Solution60 {
    public double[] dicesProbability(int n) {
        double pre[] = {1 / 6d, 1 / 6d, 1 / 6d, 1 / 6d, 1 / 6d, 1 / 6d};
        for (int i = 2; i <= n; i++) {
            // tmp数组代表，i个筛子的情况下的可能
            double tmp[] = new double[5 * i + 1];
            // 循环i - 1个筛子的可能情况
            for (int j = 0; j < pre.length; j++) {
                for (int k = 0; k < 6; k++) {
                    tmp[j + k] += pre[j] / 6;
                }
            }
            pre = tmp;
        }
        return pre;
    }
}

//    public double[] twoSum(int n) {
//        double pre[]={1/6d,1/6d,1/6d,1/6d,1/6d,1/6d};
//        for(int i=2;i<=n;i++){
//            double tmp[]=new double[5*i+1];
//            for(int j=0;j<pre.length;j++)
//                for(int x=0;x<6;x++)
//                    tmp[j+x]+=pre[j]/6;
//            pre=tmp;
//        }
//        return pre;
//    }
//
//作者：zhi-xiong
//链接：https://leetcode.cn/problems/nge-tou-zi-de-dian-shu-lcof/solution/java-dong-tai-gui-hua-by-zhi-xiong/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
